package com.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * 执行完成后的回调函数，对结果进行消费
 * <p>
 * thenApply()  将上一步的执行结果消费，并将返回结果传递给下一个 thenApply() 方法
 * thenApplyAsync()： 与thenApply()类似，但可以有个参数当线程池
 *
 * @author xudong
 */
public class CompletableFutureDemo2 {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "手动返回1");

		System.out.println("主线程");
		future.supplyAsync(() -> {
			return "手动返回2";
		});


		// 将 completableFuture 的执行结果进行消费
		future.whenComplete((result, e) -> {
			System.out.println(Thread.currentThread() + " whenComplete " + result);
			System.out.println(Thread.currentThread() + " 异常： " + e);
		});


		// 定义三个回调函数，用于处理其他的事件， 会将 completableFuture 的执行结果进行消费（会等待异步任务执行完成之后执行）
		future.thenAcceptAsync(result -> System.out.println(Thread.currentThread() + " 事件1 " + result));
		future.thenAcceptAsync(result -> System.out.println(Thread.currentThread() + " 事件2 " + result));
		future.thenAcceptAsync(result -> System.out.println(Thread.currentThread() + " 事件3 " + result));

		future.thenApply(result -> {
					System.out.println(" result 结果 " + result);
					return "上一步的执行结果：" + result + " -- -- thenApply";
				})
				.thenApplyAsync(result -> {
					System.out.println(" result2 结果 " + result);
					return "上一步的执行结果：" + result + " -- -- thenApply";
				})

		;
		// 获取 supplyAsync() 中的返回结果
		System.out.println("get() 方法" + future.get());


		TimeUnit.SECONDS.sleep(1);
		System.out.println("休眠结束");
		// complete   如果get() 或者 join()还没执行的话，则会将其打断，将参数值作为返回结果
		// System.out.println("是否打断" + future.complete(" wxd "));

	}
}
